/**
 * Universidad del Valle de Guatemala
 * Algoritmos y Estructura de Datos
 * Sección 10
 * Carlos Alberto Solórzano Pineda (08832)
 * 06 de septiembre de 2011
 * @author carlos
 * @version 1.2
 * @param <E>
 * 
 * Clase que emula una cola simple, extiende de AbstractQueue
 */
public class SimpleQueue<E> extends AbstractQueue<E>{
	
	// Atributos de la clase
	public Object data[];			// Arreglo de objetos
	public int head;			// Cabeza de la cola
	private int count;			// Cantidad de datos en la cola
	private Exception except;
	
	/**
	 * 
	 * @param size Cantidad de datos a ingresar
	 */
	public SimpleQueue(int size){
		data = new Object[size];
		head = 0;
		count = 0;
	}
	
	/**
	 * 
	 */
	public boolean add(E value) throws Exception{
		if(!full()){
			int tail = (head + count) % data.length;
			data[tail] = value;
			count++;
			return true;
		}else{
			throw except;
		}
	}
	
	/**
	 * 
	 */
	public E remove(){
		@SuppressWarnings("unchecked")
		E value = (E)data[head];
		head = (head + 1) % data.length;
		count--;
		return value;
	}
	
	/**
	 * 
	 */
	@SuppressWarnings("unchecked")
	public E peek(){
		return (E)data[head];
	}
	
	/**
	 * 
	 */
	public int size(){
		return count;
	}
	
	/**
	 * 
	 * @return True si la cola está llena
	 */
	public boolean full(){
		return count == data.length;
	}

}
